<?php

/**
 * @Author: chenjianghui
 * @Date:   2018-08-07 11:40:01
 * @Last Modified by:   chenjianghui
 * @Last Modified time: 2018-08-09 10:46:48
 */
namespace app\app\controller;

use app\common\model\VerifyCode;
use app\common\third\Email;

class Code extends Common
{
    //验证码类型：
    //          1、register_mobile       手机号注册
    //          2、login_mobile          手机号登录
    //          3、find_password_mobile  手机找回密码
    //          4、bind_mobile gen       绑定
    //          5、change_mobile         更换绑定手机号码
    //          6、bind_email            邮箱绑定
    protected static $allow_auth_type = ['register_mobile', 'login_mobile', 'find_password_mobile', 'bind_mobile', 'bind_email', 'change_mobile'];

    /**
     * 发送验证码
     * @Author   chenjianghui
     * @DateTime 2018-08-07T11:00:13+0800
     * @return   [type]                   \think\Response
     */
    public function sendCode()
    {
        $data      = input('post.');
        $auth_type = $data['type'];
        if (!in_array($auth_type, self::$allow_auth_type)) {
            renderJson('验证码类型错误', 0);
        }
        $account = $data['account'];
        if ($auth_type != 'bind_email') {
            if (!check_mobile($account)) {
                renderJson('请输入正确的手机号码', 0);
            }
        } else {
            if (!check_email($account)) {
                renderJson('请输入正确的邮箱格式', 0);
            }
        }

        // 检测同一手机号验证码发送频率
        $effective_code = VerifyCode::getEffectiveCode($auth_type, $account);
        if ($effective_code && (time() - $effective_code->create_time) < config('app.sms_code_send_frequency')) {
            renderJson('频繁发送验证码，请稍后再试', 0);
        }
        switch ($auth_type) {
            //注册
            case 'register_mobile':
                $user = model('user')->where('mobile', $account)->find();
                if ($user) {
                    renderJson('该手机号已经被注册,请重新输入', 0);
                }
                break;
            //快速登录
            case 'login_mobile':
                $user = model('user')->where('mobile', $account)->find();
                if (!$user) {
                    renderJson('该手机号码未被注册，请重新输入', 0);
                }
                break;
            //找回密码
            case 'find_password_mobile':
                $user = model('user')->where('mobile', $account)->find();
                if (!$user) {
                    renderJson('该手机号码未被注册，请重新输入', 0);
                }
                break;
            //绑定手机号码
            case 'bind_mobile':
                $user = model('user')->where('mobile', $account)->find();
                // 添加验证码记录
                $data_add              = array();
                $data_add['auth_type'] = $auth_type;
                $data_add['mobile']    = $account;
                $data_add['source']    = 'app';
                $data_add['code']      = VerifyCode::getCode();
                $code                  = VerifyCode::add($data_add);
                $res                   = 1;
                if ($code && $res) {
                    $result       = new \stdClass();
                    $result->Code = 'OK';
                    if ($result->Code == 'OK') {
                        if ($user) {
                            renderJson('该手机号码已经注册', 1, ['status' => 10001]);
                        }
                        renderJson('新手机号码，请前往设置登录密码', 1, ['status' => 10002]);
                    } else {
                        renderJson('发送失败，失败原因：' . $result->Message, 0);
                    }
                } else {
                    renderJson('发送失败', 0);
                }
                break;
            //更换绑定手机号码
            case 'change_mobile':
                \app\common\lib\User::check_login();
                $user = model('user')->where('mobile', $account)->where('uid', '<>', $this->uid)->find();
                if ($user) {
                    renderJson('该手机号码已经被注册，请重新输入', 0);
                }
                break;
            //邮箱绑定
            case 'bind_email':
                \app\common\lib\User::check_login();
                $user = model('user')->where('email', $account)->where('uid', '<>', $this->uid)->find();
                if ($user) {
                    renderJson('该邮箱帐号已经被注册，请重新输入', 0);
                }
                break;
            default:
                renderJson('验证码类型错误', 0);
                break;
        }

        // 添加验证码记录
        $data_add              = array();
        $data_add['auth_type'] = $auth_type;
        $data_add['mobile']    = $account;
        $data_add['source']    = 'app';
        $data_add['code']      = VerifyCode::getCode();
        $code                  = VerifyCode::add($data_add);
        if ($auth_type == 'bind_email') {
            $res = Email::send($account, '邮箱绑定', '验证码：' . $data_add['code']);
        } else {
            $res = 1;
        }
        if ($code && $res) {
            $result       = new \stdClass();
            $result->Code = 'OK';
            if ($result->Code == 'OK') {
                renderJson('发送成功', 1);
            } else {
                renderJson('发送失败，失败原因：' . $result->Message, 0);
            }
        } else {
            renderJson('发送失败', 0);
        }
    }
}
